package com.example.wepaydemo;/*
 * 文 件 名:  cn.qdama.wepaydemo
 * 描    述:  <描述>
 * 修 改 人:  zhourunjin
 * 修改时间:  2018-07-14
 */

import com.thoughtworks.xstream.XStream;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Date;
import java.util.UUID;

@Service
public class TestService {


    public MallWePayXcxData pay(HttpServletRequest request, Integer userId, String OrderNo, String openid) throws IllegalAccessException, IOException {

        //此处做统一支付例子
        //统一支付 注意：这里的请求参数为微信里面的请求参数，不能多也不能少，不是驼峰命名！！不是驼峰命名！！不是驼峰命名！！不是驼峰命名！！不是驼峰命名！！
        Unifiedorder unifiedorder = new Unifiedorder();
        unifiedorder.setAppid("APPID");
        unifiedorder.setMch_id("MCH_ID");
        //随机字符串
        unifiedorder.setNonce_str(UUID.randomUUID().toString().replace("-", ""));
        //描述
        unifiedorder.setBody("钱大妈不卖隔夜肉");
        //商户订单号
        unifiedorder.setOut_trade_no(OrderNo);
        // 单位分
        unifiedorder.setTotal_fee("1");
        //来源ip
        unifiedorder.setSpbill_create_ip(getIp(request));// IP
        //回调函数
        unifiedorder.setNotify_url("www.baidu.com");
        //支付类型
        unifiedorder.setTrade_type("JSAPI");// JSAPI，NATIVE，APP，MWAB 公众号小程序用jsapi
        //openid
        unifiedorder.setOpenid(openid);
        unifiedorder.setSign_type("MD5");
        unifiedorder.setSign(Signature.getSign(unifiedorder));


        //这个方法为通用方法。适用于支付，支付查询退款查询等，唯一不适用的是退款，只需将url和param改为相对于的参数对象就行，例如现在是统一支付。
        //注意参数是对照微信请求参数，不是驼峰命名！！不是驼峰命名！！不是驼峰命名！！不是驼峰命名！！不是驼峰命名！！ 再说一遍
        String result = PayUtil.request("https://api.mch.weixin.qq.com/pay/unifiedorder",unifiedorder);
        //返回来的是xml字符串，咋们转换为对应的对象，这里是统一支付，所以转换为UnifiedorderResult
        //这里不是驼峰命名！！不是驼峰命名！！不是驼峰命名！！不是驼峰命名！！不是驼峰命名！！ 再说一遍
        XStream xStream = new XStream();
        xStream.alias("xml", UnifiedorderResult.class);
        UnifiedorderResult unifiedorderResult = (UnifiedorderResult) xStream.fromXML(result);

        //----------------------------------以下为对应业务处理。------------------------------------
        //封装返回数据
        //小程序支付所需数据
        MallWePayXcxData xcxData = new MallWePayXcxData();
        xcxData.setAppid("APPID");
        xcxData.setPrepayid(unifiedorderResult.getPrepay_id());
        xcxData.setOuttradeno(OrderNo);
        //最重要是这个 预支付id
        xcxData.setPackagevalue("prepay_id="+unifiedorderResult.getPrepay_id());
        xcxData.setNoncestr(UUID.randomUUID().toString().replace("-", ""));
        xcxData.setTimestamp(new Date().getTime()/1000+"");
        xcxData.setSign(Signature.getSign(xcxData));
        xcxData.setSignType("MD5");
        xcxData.setMweburl(null);

        return xcxData;


    }

    /**
     *
     * <一句话功能简述> 查询ip地址 <功能详细描述>
     *
     * @param request
     * @return String
     * @see [类、类#方法、类#成员]
     * @author zoujingwei 2018年1月9日
     */
    public static String getIp(HttpServletRequest request) {
        String ip = request.getHeader("X-Forwarded-For");
        if (StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
            // 多次反向代理后会有多个ip值，第一个ip才是真实ip
            int index = ip.indexOf(",");
            if (index != -1) {
                return ip.substring(0, index);
            }
            else {
                return ip;
            }
        }
        ip = request.getHeader("X-Real-IP");

//        if (ip.equals("0:0:0:0:0:0:0:1") || ip.isEmpty() || ip ==null) {
        ip = "127.0.0.1";
//        }
        if (StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
            return ip;
        }
        return request.getRemoteAddr();
    }
}
